package edu.nuc.ahm.juc.unsafecollection;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 *           //  java.util.ConcurrentModificationException  并发下 ArrayList 是 不安全的
 *           Vector 就解决了
 *           问: ArrayList  你的 add 为什么不加 synchronized解决 ?  Vector人家的add 就synchronized 就加锁了
 *           其他解决 ：1.  List<String> list = Collections.synchronizedList(new ArrayList());
 *                     2. new CopyOnWriteArrayList<>()
 */
public class ListTest {
    public static void main(String[] args) {
//        List<String> list = Arrays.asList("1","2","3");
//        list.forEach(System.out::println);
//       1.  List<String> list = new Vector<>();
//       2.  List<String> list = Collections.synchronizedList(new ArrayList<>());
        List<String> list = new CopyOnWriteArrayList<>(); //  private transient volatile Object[] array; 底层是这个
        // 写入时复制
        // 多线程调用的时候 ， list, 读取的时候， 固定的，写入（覆盖）
        // 再写入的时候避免覆盖，造成数据问题
        // 读写分离  写入的时候 先复制一个出来 写入完再插入进去
        // CopyOnwriteArrayList 比 Vector NB 在哪？
        // 只要有 synchronized 方法 写入的时候效率比较低 加个锁省事了
          //  java.util.ConcurrentModificationException  并发下 ArrayList 是 不安全的
        for (int i = 0; i < 10; i++) {
//            list.add(UUID.randomUUID().toString().substring(0,5));
            new Thread(()->{
                list.add(UUID.randomUUID().toString().substring(1,10));
                System.out.println(list);
            }).start();
        }


    }
}
